import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.io.Serializable;

public class Selecao extends Desenhavel implements ISelecaoListener,
		Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1185565632412528017L;
	/**
	 * 
	 */

	/**
	 * @uml.property name="retanguloSelecao"
	 * @uml.associationEnd inverse="selecao:Retangulo"
	 */
	private Identificador identificador;
	/**
	 */

	private SelecaoNorte selecaoNorte;
	private SelecaoEste selecaoEste;
	private SelecaoOeste selecaoOeste;
	private SelecaoSul selecaoSul;
	private SelecaoNEste selecaoNEste;
	private SelecaoNOeste selecaoNOeste;
	private SelecaoSEste selecaoSEste;
	private SelecaoSOeste selecaoSOeste;

	private Retangulo retanguloEnvolvente;

	private Selecionado selecionado = Selecionado.FALSE;

	public Selecao(Identificador identificador, Retangulo retanguloEnvolvente) {
		this.retanguloEnvolvente = retanguloEnvolvente;
		this.identificador = identificador;
		this.retanguloEnvolvente.setSelecaoListener(this);
		construirSelecao();
	}

	public void setRetanguloEnvolvente(Retangulo retanguloEnvolvente) {
		this.retanguloEnvolvente = retanguloEnvolvente;

	}

	public void construirSelecao() {
		this.selecaoNorte = new SelecaoNorte(this.identificador,
				this.retanguloEnvolvente);
		this.selecaoEste = new SelecaoEste(this.identificador,
				this.retanguloEnvolvente);
		this.selecaoOeste = new SelecaoOeste(this.identificador,
				this.retanguloEnvolvente);
		this.selecaoSul = new SelecaoSul(this.identificador,
				this.retanguloEnvolvente);
		this.selecaoSOeste = new SelecaoSOeste(this.identificador,
				this.retanguloEnvolvente);
		this.selecaoNOeste = new SelecaoNOeste(this.identificador,
				this.retanguloEnvolvente);
		this.selecaoSEste = new SelecaoSEste(this.identificador,
				this.retanguloEnvolvente);
		this.selecaoNEste = new SelecaoNEste(this.identificador,
				this.retanguloEnvolvente);

	}

	public void setSelecionado(Selecionado selecionado) {
		this.selecionado = selecionado;
	}

	public Selecionado getSelecionado() {
		return selecionado;
	}

	public Identificador getIdentificador() {
		return identificador;
	}

	public void setIdentificador(Identificador identificador) {
		this.identificador = identificador;
	}

	public Retangulo getRetanguloEnvolvente() {
		return retanguloEnvolvente;
	}

	public SelecaoTipo getSelecaoTipo() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void selecaoAlterada() {
		// TODO Auto-generated method stub
		construirSelecao();
	}

	@Override
	public void desenhar(Graphics graphics) {
		// TODO Auto-generated method stub
		if (selecionado != Selecionado.FALSE) {
			Graphics2D g2 = (Graphics2D) graphics.create();
			g2.setColor(Color.red);
			g2.draw(this.selecaoNorte.getDesenhar());
			g2.draw(this.selecaoEste.getDesenhar());
			g2.draw(this.selecaoOeste.getDesenhar());
			g2.draw(this.selecaoSul.getDesenhar());
			g2.draw(this.selecaoNEste.getDesenhar());
			g2.draw(this.selecaoNOeste.getDesenhar());
			g2.draw(this.selecaoSEste.getDesenhar());
			g2.draw(this.selecaoSOeste.getDesenhar());
		}
	}

	public SelecaoTipo contem(Identificador ident, Coordenada coordenada) {
		// TODO Auto-generated method stub
		Selecao selecao = ident.getSelecao();
		if (selecao != null) {
			if (selecao.selecaoEste.contem(coordenada)) 
				return SelecaoTipo.ESTE;
			else if (selecao.selecaoNEste.contem(coordenada))
				return SelecaoTipo.NESTE;
			else if (selecao.selecaoNOeste.contem(coordenada))
				return SelecaoTipo.NOESTE;
			else if (selecao.selecaoNorte.contem(coordenada))
				return SelecaoTipo.NORTE;
			else if (selecao.selecaoSEste.contem(coordenada))
				return SelecaoTipo.SESTE;
			else if (selecao.selecaoSOeste.contem(coordenada))
				return SelecaoTipo.SOESTE;
			else if (selecao.selecaoSul.contem(coordenada))
				return SelecaoTipo.SUL;
			else if (selecao.selecaoOeste.contem(coordenada))
				return SelecaoTipo.OESTE;
			else
				return SelecaoTipo.NULL;
		}
		return SelecaoTipo.NULL;
	}

	public boolean contains(Identificador identificador) {
		// TODO Auto-generated method stub
		return this.identificador == identificador;
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return null;
	}

}
